package main

import "fmt"

//我写的·300ms
//func lengthOfLongestSubstring(s string) int {
//	if len(s) == 0 || len(s) == 1 {
//		return len(s)
//	}
//	long := 0
//	for ix := 0; ix < len(s); ix++ {
//		charMap := make(map[string]bool)
//		length := 0
//		for iy := ix; iy < len(s); iy++ {
//			if charMap[string(s[iy])] {
//				break
//			}
//			charMap[string(s[iy])] = true
//			length++
//		}
//		if length > long {
//			long = length
//		}
//	}
//
//	return long
//}

func main() {
	//fmt.Println("3   :")
	//fmt.Println(lengthOfLongestSubstring("abcabcbb"))
	//fmt.Println("1   :")
	//fmt.Println(lengthOfLongestSubstring("bbbbb"))
	//fmt.Println("3   :")
	fmt.Println(lengthOfLongestSubstring("pwwkew"))

}

//func lengthOfLongestSubstring(s string) int {
//	n := len(s)// 获得字符串长度
//	if n <= 1 {// 对于字符串长度为0,1的可以直接返回了
//		return n
//	}
//
//	// 使用哈希集合存储字符的出现情况
//	// rune类型可以表示任意Unicode字符，并能存储一个32位的Unicode字符编码
//	// byte和rune可以直接转换
//	// 用map会比数组慢,毕竟要计算
//	set := make(map[byte]bool)
//
//	left := 0
//	right := 0
//	maxLength := 0
//
//	for right < n {
//		// 如果当前字符已经在集合中存在，则移动左指针，并将该字符从集合中移除
//		if set[s[right]] {
//			delete(set, s[left])
//			left++
//		} else {
//			// 如果当前字符不在集合中，则将其加入集合，并更新最大长度
//			set[s[right]] = true
//			maxLength = max(maxLength, right-left+1)
//			right++
//		}
//	}
//
//	return maxLength
//}
//
//func max(a, b int) int {
//	if a > b {
//		return a
//	}
//	return b
//}

// 别人的·，1ms
func lengthOfLongestSubstring(s string) (ans int) {
	n := len(s)
	start, end := 0, 0
	window := [128]bool{}
	for end < n {
		for window[s[end]] {
			window[s[start]] = false
			start++
		}
		window[s[end]] = true
		//ans = max(ans, end-start+1)
		if ans < end-start+1 {
			ans = end - start + 1
		}
		end++
	}
	return
}
